# 安装或升级必要的依赖包
# langchain-text-splitters: 包含LangChain的各种文本分割器
# tiktoken: OpenAI开源的快速BPE分词器，用于准确计算token数量，可以保证token不超过限制
# --quiet: 静默安装，减少输出信息
# pip install --upgrade --quiet langchain-text-splitters tiktoken

# 导入字符文本分割器
from langchain_text_splitters import CharacterTextSplitter

# 读取知识库文件
# 使用with语句确保文件正确关闭
# encoding="utf-8" 确保中文字符正确读取，避免编码错误
with open("./llm_langchain_data/knowledge.txt", encoding="utf-8") as f:
    knowledge = f.read()

# 创建基于tiktoken分词器的字符文本分割器
# CharacterTextSplitter.from_tiktoken_encoder() 方法：
# - 使用tiktoken分词器来准确计算token数量
# - 确保分割后的每个chunk的token数不超过指定限制
#
# 参数说明：
# encoding_name="cl100k_base": 指定使用的分词编码
#   - cl100k_base: OpenAI GPT-4、ChatGPT等模型使用的分词方案
#   - 支持多语言，包括中文，能准确计算中英文混合文本的token数
# chunk_size=100: 每个文本块的最大token数量
#   - 这里设置为100个tokens，不是100个字符
#   - 对于中文文本，通常1个汉字约1-2个tokens
#   - 这个大小适合作为示例，实际使用时可根据需求调整（通常200-1000）
# chunk_overlap=0: 相邻文本块之间的重叠token数量
#   - 0表示不重叠，每个块都是独立的
#   - 如果设置为正数（如20），可以保持上下文连贯性
#   - 重叠有助于避免在重要信息边界处切断上下文
text_splitter = CharacterTextSplitter.from_tiktoken_encoder(
    encoding_name="cl100k_base",
    chunk_size=100,
    chunk_overlap=0
)

# 执行文本分割
# split_text() 方法将长文本分割成多个文本块
# 返回一个字符串列表，每个字符串是一个分割后的文本块
texts = text_splitter.split_text(knowledge)

# 打印第一个分割后的文本块
# texts[0] 是列表中的第一个元素，即第一个文本块
print("第一个文本块的内容：")
print(texts[0])
print(f"\n总共分割成 {len(texts)} 个文本块")

# 可选：查看所有文本块的基本信息
print("\n=== 分割结果统计 ===")
print(f"原始文本长度: {len(knowledge)} 个字符")
print(f"分割后块数: {len(texts)} 块")
print(f"平均每块字符数: {len(knowledge) // len(texts)} 字符")

# 可选：显示每个文本块的详细信息
print("\n=== 各文本块详情 ===")
for i, text in enumerate(texts):
    print(f"块 {i+1}: {len(text)} 字符, 前50字符: {text[:50]}...")

# 可选：使用tiktoken验证token数量
try:
    import tiktoken
    encoding = tiktoken.get_encoding("cl100k_base")
    token_count = len(encoding.encode(texts[0]))
    print(f"\n第一个文本块的token数量: {token_count}")
except ImportError:
    print("\n如需验证token数量，请确保已安装tiktoken")